/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package parser;

import com.thoughtworks.qdox.JavaDocBuilder;
import com.thoughtworks.qdox.model.DocletTag;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaField;
import com.thoughtworks.qdox.model.JavaMethod;
import com.thoughtworks.qdox.model.JavaSource;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 *
 * @author Filipe
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        JavaDocBuilder jdb = new JavaDocBuilder();
        List<File> pastas = new ArrayList<File>();
        pastas.add(new File("sources"));
        SimpleDateFormat sdf = new SimpleDateFormat();
        Date data;

        while (!pastas.isEmpty()) {
            File actual = pastas.remove(0);
            if (actual.isDirectory()) {
                System.out.println("A expandir:" + actual);
                File[] listFiles = actual.listFiles();
                for (File file : listFiles) {
                    pastas.add(file);
                }
            } else {
                try {
                    jdb.addSource(actual);
                } catch (Exception e) {
                    System.out.println("Nao acolhe:\t" + actual);
                }
                System.out.println("adding: " + actual);

                System.out.println("PATH: " + actual.getAbsoluteFile().getPath());

                data = new Date(actual.getAbsoluteFile().lastModified());
                System.out.println("MODIFIED DATE: " + sdf.format(data));

                System.out.println("SIZE: " + actual.getAbsoluteFile().length() + " bytes");

            }
        }

        JavaClass[] classes = jdb.getClasses();

        for (JavaClass javaClass : classes) {

            System.out.println("Classe: " + javaClass.getName());

            System.out.println("\n-\tComent: " + javaClass.getComment());

            System.out.println("\n Package: " + javaClass.getPackage());

            System.out.println("\n VARS:");
            for (JavaField javaField : javaClass.getFields()) {
                System.out.println("VAR: " + javaField.getName());
            }

            DocletTag[] tags = javaClass.getTags();
            for (DocletTag docletTag : tags) {
                System.out.println("\n\n-\tTag: " + docletTag.getName() + " > " + docletTag.getValue());
            }

            JavaMethod[] methods = javaClass.getMethods();

            //
            //Usar no campo de pesquisa por exemplo a frase: "recebe String" temos que procurar
            //nos valores de entrada do metodo ou classe. Mesma coisa para "devolve string", procura
            //nos valores de saida do metodo.
            // Isso já é a parte de interpretar o que é pedido no campo de entrada.
            // tem que ter a inteligencia suficiente para perceber o que é pedido.



            for (JavaMethod javaMethod : methods) {
//                for (DocletTag methodTags : javaMethod.getTags()) {
//                    System.out.println("Tag do Metodo: " + methodTags.getName() + " > " + methodTags.getValue());
//                }


                System.out.println("Nome Metodo: " + javaMethod.getName());
                System.out.println("CODIGO: " + javaMethod.getPropertyName());
                System.out.println("Returns: " + javaMethod.getReturns());

            // System.out.println("-\t-\tComent: " + javaMethod.getComment());
            }
        }
    }
}

